package com.whzjkj.gateway.util;

import lombok.extern.slf4j.Slf4j;

/**
 * @description:
 * @author: Mr.Hu
 * @create: 2018-10-31 15:53
 **/
@Slf4j
public class BCD8421Utils {

    public static String bcd2String(byte[] data){
        StringBuffer sb = new StringBuffer(data.length*2);
        for (int i=0, len= data.length;i<len;i++){
            sb.append((data[i] & 0xf0)>>>4);
            sb.append(data[i] & 0x0f);
        }
        return sb.toString().startsWith("0")?sb.toString().substring(1):sb.toString();
    }

    /**
     * String 转 bcd[6]
     * @param str
     * @return
     */
    public static byte[] string2Bcd(String str){
        //String长度为基数，则在前面补"0"
        if ((str.length() & 0x1)==1){
            str = "0" + str;
        }
        byte[] bytes = new byte[str.length()/2];
        byte[] bs = str.getBytes();
        //System.out.println("string2Bcd:"+ByteUtils.byteToInteger(bs));
        for (int i=0, len=bytes.length; i<len;i++){
            byte high = ascII2Bcd(bs[2 * i]);
            byte low = ascII2Bcd(bs[2 * i + 1]);
            bytes[i] = (byte) ((high << 4) | low);
        }
        log.info(HexUtils.toHexString(bytes));
        return bytes;
    }

    /**
     * 8421 BCD码是最基本和最常用的BCD码，它和四位自然二进制码相似，各位的权值为8、4、2、1，故称为有权BCD码。
     * 和四位自然二进制码不同的是，它只选用了四位二进制码中前10组代码，即用0000~1001分别代表它所对应的十进制数，
     * 余下的六组代码不用。
     * @param asc
     * @return
     */
    private static byte ascII2Bcd(byte asc) {
        if ((asc >= '0') && (asc <= '9'))
            return (byte) (asc - '0');
        else if ((asc >= 'A') && (asc <= 'F'))
            return (byte) (asc - 'A' + 10);
        else if ((asc >= 'a') && (asc <= 'f'))
            return (byte) (asc - 'a' + 10);
        else
            return (byte) (asc - 48);
    }
}
